
package com.study.manage.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * 数字处理工具类
 * 
 * @version 1.0 2017/9/5
 */
public class CmnNumberUtil {

    /**
     * 判断一个值是否在范围内
     * 
     * @param source 判断值
     * @param start 开始值
     * @param end 结束值
     * @return true:范围内
     */
    public static boolean isBetween(int source, int start, int end) {

        return ((Math.max(source, start) == source) && ((Math.min(source, end) == source)));
    }

    /**
     * 转换成int型（默认值为0）
     * 
     * @param number 转换对象
     * @return 转换后值
     */
    public static int toInt(Object number) {

        return toInt(number, 0);
    }

    /**
     * 转换成int型
     * 
     * @param number 转换对象
     * @param defaultValue 默认值
     * @return 转换后值
     */
    public static int toInt(Object number, int defaultValue) {

        if (number == null){
            return defaultValue;
        }

        if (number instanceof String){
            return Integer.parseInt((String) number);
        }else if (number instanceof Number){
            return ((Number) number).intValue();
        }else if (number instanceof BigDecimal){
            return ((BigDecimal) number).intValue();
        }

        return defaultValue;
    }

    /**
     * 转换成short型（默认值为0）
     * 
     * @param number 转换对象
     * @return 转换后值
     */
    public static short toShort(Object number) {

        return toShort(number, Short.valueOf("0"));
    }

    /**
     * 转换成short型
     * 
     * @param number 转换对象
     * @param defaultValue 默认值
     * @return 转换后值
     */
    public static short toShort(Object number, short defaultValue) {

        if (number == null){
            return defaultValue;
        }

        if (number instanceof String){
            return Short.valueOf((String) number);
        }else if (number instanceof Number){
            return ((Number) number).shortValue();
        }else if (number instanceof BigDecimal){
            return ((BigDecimal) number).shortValue();
        }

        return defaultValue;
    }

    /**
     * 转换成long型（默认值为0）
     * 
     * @param number 转换对象
     * @return 转换后值
     */
    public static long toLong(Object number) {

        return toLong(number, 0);
    }

    /**
     * 转换成long型
     * 
     * @param number 转换对象
     * @param defaultValue 默认值
     * @return 转换后值
     */
    public static long toLong(Object number, long defaultValue) {

        if (number == null){
            return defaultValue;
        }

        if (number instanceof String){
            return Long.parseLong((String) number);
        }else if (number instanceof Number){
            return ((Number) number).longValue();
        }else if (number instanceof BigDecimal){
            return ((BigDecimal) number).longValue();
        }

        return defaultValue;
    }

    /**
     * 转换成Long型
     * 
     * @param number 转换对象
     * @param defaultValue 默认值
     * @return 转换后值
     */
    public static Long convLong(Object number) {

        if (number == null){
            return null;
        }

        if (number instanceof String){
            if (CmnStringUtils.isEmpty((String) number)){
                return null;
            }
            return Long.parseLong((String) number);
        }else if (number instanceof Number){
            return ((Number) number).longValue();
        }else if (number instanceof BigDecimal){
            return ((BigDecimal) number).longValue();
        }

        return null;
    }

    /**
     * 转换成Integer型
     * 
     * @param number 转换对象
     * @return 转换后值
     */
    public static Integer convInteger(Object number) {

        if (number == null){
            return null;
        }

        if (number instanceof String){
            if (CmnStringUtils.isEmpty((String) number)){
                return null;
            }
            return Integer.parseInt((String) number);
        }else if (number instanceof Number){
            return ((Number) number).intValue();
        }else if (number instanceof BigDecimal){
            return ((BigDecimal) number).intValue();
        }

        return null;
    }

    /**
     * 转换成BigDecimal型（默认值为0）
     * 
     * @param number 转换对象
     * @return 转换后值
     */
    public static BigDecimal toBigDecimal(Object number) {

        return toBigDecimal(number, BigDecimal.ZERO);

    }

    /**
     * 转换成BigDecimal型
     * 
     * @param number 转换对象
     * @param defaultValue 默认值
     * @return 转换后值
     */
    public static BigDecimal toBigDecimal(Object number, BigDecimal defaultValue) {

        if (number == null){
            return defaultValue;
        }

        if (number instanceof String){
            return new BigDecimal((String) number);
        }else if (number instanceof BigDecimal){
          return (BigDecimal) number;
        }else if (number instanceof Number){
            return BigDecimal.valueOf(toLong(number));
        }

        return defaultValue;
    }

    /**
     * 比较大小 （null 比任何数字小）
     * <p>
     * <li>相等为0
     * <li>number1 < number2 ： -1
     * <li>number1 > number2 ： 1
     * 
     * @param number1 数字1
     * @param number2 数字2
     * @return 比较结果
     */
    public static int compareTo(Object number1, Object number2) {

        if (number1 == null && number2 == null){
            return 0;
        }

        if (number1 == null){
            return -1;
        }

        if (number2 == null){
            return 1;
        }

        return toBigDecimal(number1).compareTo(toBigDecimal(number2));
    }

    /**
     * 判断该文字列是否为数字（非小数）
     * 
     * @param chkStr 确认文字列
     * @return true：数字 false 非数字
     */
    public static boolean isNumber(String chkStr) {

        try{
            Integer.parseInt(chkStr);
        }catch (NumberFormatException e){
            return false;
        }
        return true;
    }


    /**
     * 获取实数
     * 
     * @param intNum 整数
     * @return 实数
     */
    public static BigDecimal percentToNum(Integer intNum) {

        if (intNum == null){
            return null;
        }
        return toBigDecimal(intNum).divide(toBigDecimal(100));
    }

    /**
     * 相处后向上取整
     * 
     * @param divser 除数
     * @param toDivs 被除数
     * @return 向上取整
     */
    public static int divisionRoundUp(Object divser, Object toDivs) {

        return toInt(toBigDecimal(divser).divide(toBigDecimal(toDivs),
            BigDecimal.ROUND_UP));
    }

    /**
     * 四舍五入
     * 
     * @param num 原数字
     * @param roundDigit 保留的小数位数<br>
     *            <p>
     *            <i><b>eg:</b></i>　如果roundDigit <= 0, 则返回 整数部; <br>
     *            如果roundDigit = 1, 则返回 xxx.0; <br>
     *            如果roundDigit = 2, 则返回 xxx.00;以此类推。
     *            </p>
     * @return 四舍五入后的数字
     */
    public static double round(double num, int roundDigit) {

        if (roundDigit <= 0){
            return Math.round(num);
        }
        BigDecimal b = new BigDecimal(num);
        return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    
    /**
     * 数值格式转换为货币格式
     * @param target 目标值
     * @param formatPattern 格式化样式
     * @return 货币格式的数值
     */
    public static String numberFormat(BigDecimal target,String formatPattern){
        if(target == null){
            return null;
        }
        NumberFormat foramt = new DecimalFormat(formatPattern);
        String returnVal = foramt.format(target.doubleValue());
        return returnVal;
    }
}
